
package model.persistencia;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;
import model.UnidadeModel;

public class UnidadeDAO {
    
    
    
    private Statement stmt;
    private Connection con;
    private PreparedStatement ps;
    private BancoDeDados conexaoBanco;
    private ResultSet resultado;

    public UnidadeDAO() {
        conexaoBanco = new BancoDeDados();                
    }
    
    
    
    public void inserir(UnidadeModel unidade) {
        con = null;
        ps = null;            
        con = conexaoBanco.getConexao();              
        String sql = "INSERT INTO unidade(unidade_pk, descricao, ativo) VALUES (?, ?, ?);";                   
        try {
            ps = con.prepareStatement(sql);            
            ps.setInt(1, unidade.getCodigo());
            ps.setString(2, unidade.getDescricao()); 
            ps.setBoolean(3, true); 
            ps.execute();            
        } catch (SQLException ex) {
            Logger.getLogger(UnidadeDAO.class.getName()).log(Level.SEVERE, null, ex);
            JOptionPane.showMessageDialog(null, "Erro no no banco no cadastro de Unidades:\n"+
                        ex.getMessage()+"\n","Mensagem de Erro!",JOptionPane.ERROR_MESSAGE);
        }finally{
            try {
                ps.close();
                con.close(); 
            } catch (SQLException ex) {
                Logger.getLogger(UnidadeDAO.class.getName()).log(Level.SEVERE, null, ex);
                JOptionPane.showMessageDialog(null, "Erro ao encerrar conexão:\n"+
                        ex.getMessage()+"\n","Mensagem de Erro!",JOptionPane.ERROR_MESSAGE);
            }            
        }
    }

    
    public void delete(UnidadeModel unidade) {
        con = null;
        ps = null;
        con = conexaoBanco.getConexao(); 
        String sql = "DELETE FROM unidade WHERE unidade_pk = "+unidade.getCodigo()+";";  
        try {
            ps = con.prepareStatement(sql);
            ps.execute();
        } catch (SQLException ex) {
            Logger.getLogger(UnidadeDAO.class.getName()).log(Level.SEVERE, null, ex);
            JOptionPane.showMessageDialog(null, "Erro no no banco no Exclusão de Unidade:\n"+
                        ex.getMessage()+"\n","Mensagem de Erro!",JOptionPane.ERROR_MESSAGE);
        }finally{
            try {
                con.close();
                ps.close();
            } catch (SQLException ex) {
                Logger.getLogger(UnidadeDAO.class.getName()).log(Level.SEVERE, null, ex);
                JOptionPane.showMessageDialog(null, "Erro ao encerrar conexão:\n"+
                        ex.getMessage()+"\n","Mensagem de Erro!",JOptionPane.ERROR_MESSAGE);
            }           
        }           
    }

    
    public void atualizar(UnidadeModel unidade) {
        con = conexaoBanco.getConexao();
        ps = null;        
        String sql = "UPDATE unidade SET descricao=? WHERE unidade_pk=?;";        
        try{
            ps = con.prepareStatement(sql);                        
            ps.setString(1, unidade.getDescricao());       
            ps.setInt(2, unidade.getCodigo());
            ps.executeUpdate();            
        }catch(SQLException ex) {
            Logger.getLogger(UnidadeDAO.class.getName()).log(Level.SEVERE, null, ex);
            JOptionPane.showMessageDialog(null,  "Erro ao execultar a Atualização de Unidade:\n"+
                    ex.getMessage()+"\n","Mensagem de Erro!",JOptionPane.ERROR_MESSAGE);
        }finally{
            try {
                ps.close();
                con.close();                
            } catch (SQLException ex) {
                Logger.getLogger(UnidadeDAO.class.getName()).log(Level.SEVERE, null, ex);
                JOptionPane.showMessageDialog(null, "Erro ao encerrar conexão:\n"+
                        ex.getMessage()+"\n","Mensagem de Erro!",JOptionPane.ERROR_MESSAGE);
            }            
        }       
    }

    
    public List<UnidadeModel> pesquisar(int iOpcao, String iPesquisa) {        
        List<UnidadeModel> listaUnidade = new ArrayList<UnidadeModel>();        
        resultado = null;
        con = null;        
        stmt = null;                           
        con = conexaoBanco.getConexao();                       
        try{        
            stmt = (Statement) con.createStatement();
            resultado = stmt.executeQuery("SELECT unidade.unidade_pk, unidade.descricao FROM public.unidade where ativo = true;");                                   
            while(resultado.next()) {
                UnidadeModel unidadeTemp = new UnidadeModel();            
                unidadeTemp.setCodigo(resultado.getInt("unidade_pk"));                
                unidadeTemp.setDescricao(resultado.getString("descricao"));                   
                listaUnidade.add(unidadeTemp);
            }
        } catch (SQLException ex) {
            Logger.getLogger(UnidadeDAO.class.getName()).log(Level.SEVERE, null, ex);            
            JOptionPane.showMessageDialog(null, "Erro na Pesquisa de Unidades.\n"+
                    ex.getMessage(),"Mensagem de Erro!",JOptionPane.ERROR_MESSAGE);
        }finally{
            try {
                con.close();
                stmt.close();
                resultado.close();
            } catch (SQLException ex) {
                Logger.getLogger(UnidadeDAO.class.getName()).log(Level.SEVERE, null, ex);
                JOptionPane.showMessageDialog(null, "Erro ao encerrar conexão:\n"+
                        ex.getMessage()+"\n","Mensagem de Erro!",JOptionPane.ERROR_MESSAGE);
            }
        }
        return listaUnidade;        
    }   

    
    public String getSQL(int iOpcao, String iPesquisa) {
        String sql = null;        
        switch (iOpcao){
            case UnidadeModel.SQL_PRIMEIRO: sql = "SELECT MIN(unidade.unidade_pk) as unidade_pk FROM public.unidade;";break;
            case UnidadeModel.SQL_ANTERIOR: sql = "SELECT MAX(unidade.unidade_pk) as unidade_pk FROM public.unidade "
                    + "WHERE unidade.unidade_pk < "+ iPesquisa +";";break;
            case UnidadeModel.SQL_PROXIMO: sql = "SELECT MIN(unidade.unidade_pk) as unidade_pk FROM public.unidade "
                    + "WHERE unidade.unidade_pk > "+ iPesquisa +";";break;
            case UnidadeModel.SQL_ULTIMO: sql = "SELECT MAX(unidade.unidade_pk) as unidade_pk FROM public.unidade;";break;
            case UnidadeModel.SQL_CODIGO: sql = "SELECT unidade.unidade_pk, unidade.descricao FROM public.unidade "
                    + "WHERE unidade.unidade_pk = "+ iPesquisa +";";break;
            case UnidadeModel.SQL_DESCRICAO: sql = "SELECT unidade.unidade_pk, unidade.descricao FROM public.unidade "
                    + "WHERE unidade.descricao like '%"+ iPesquisa +"%' ORDER BY unidade.unidade_pk;";break;
            case UnidadeModel.SQL_GETALL: sql = "SELECT unidade.unidade_pk, unidade.descricao FROM public.unidade where ativo = false;";break;    
        }        
        return sql;
    }

    
    public int getCodigo(int iOpcao, int iCodigoAtual) {                        
        stmt = null;
        resultado = null;
        con = null;        
        con = conexaoBanco.getConexao();                       
        int codigoEncontrado = -1;        
        try{        
            stmt = (Statement) con.createStatement();
            resultado = stmt.executeQuery(getSQL(iOpcao, String.valueOf(iCodigoAtual)));        
            resultado.next();
            codigoEncontrado = resultado.getInt("unidade_pk");
        }catch(SQLException ex) {
            Logger.getLogger(UnidadeDAO.class.getName()).log(Level.SEVERE, null, ex);
            JOptionPane.showMessageDialog(null, "Erro ao execultar a sql de Navegação:\n"+
                    ex.getMessage()+"\n","Mensagem de Erro!",JOptionPane.ERROR_MESSAGE);
        }finally{
            try {
                con.close();
                stmt.close();
                resultado.close();
            } catch (SQLException ex) {
                Logger.getLogger(UnidadeDAO.class.getName()).log(Level.SEVERE, null, ex);
                JOptionPane.showMessageDialog(null, "Erro ao encerrar conexão:\n"+
                        ex.getMessage()+"\n","Mensagem de Erro!",JOptionPane.ERROR_MESSAGE);
            }            
        }        
        return codigoEncontrado;       
    }

    
    public UnidadeModel getUnidade(int id) {
        List<UnidadeModel> listaUnidades;
        UnidadeModel unidadeTemp;
        listaUnidades = pesquisar(UnidadeModel.SQL_CODIGO, String.valueOf(id));
        unidadeTemp = listaUnidades.get(0);
        return unidadeTemp;        
    }

    
}
